Iphone sdk: resolver [uinavigationcontroller pushviewcontroller:] selector não reconhecido enviada à instância
Video: iPhone SDK: Working With UINavigationController
Conteúdo
Adoro codificação para o iPhone SDK. É a codificação mais alegre que eu fiz no quarto de século (surpresa!) Passei codificação de vários sistemas de computador. É uma combinação de Objective-C (elegante) e Cacau (bela). Há uma exceção que eu continuo recebendo e apenas raramente suficiente para que eu esquecer porque eu entendo. Pensei que alguém pode beneficiar deste porque é uma armadilha fácil de cair.
A excepção em causa:
*** terminação app devido à exceção não capturada `NSInvalidArgumentException`, razão: `*** - [UINavigationController pushViewController:]: selector não reconhecido enviada à instância 0x5255c0`
Se você usar o modelo de aplicativos baseados em navegação ao criar um novo projeto, você vai ter um conjunto de arquivos de projeto que você recebe um bom bocado do caminho para uma aplicação funcional. Na verdade, você pode bater de construção e ir e o aplicativo irá compilar, executar e mostrar-lhe uma bonita vista mesa. Você provavelmente irá, em seguida, adicionar o código para fazer as coisas de exibição de exibição de tabela nas células, testando ao longo do caminho, e ele vai trabalhar. Em algum ponto, você pode querer fazer retoques nas células abrir uma nova visão. O modelo fornece um método de exemplo “didSelectRowAtIndexPath” mostrados aqui:
- (Void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath {
// lógica de navegação pode ir aqui. Criar e empurre outro controlador de vista.
// AnotherViewController * anotherViewController = [[AnotherViewController alloc] initWithNibName: @"Outra vista" Bundle: nil] -
// [self.navigationController pushViewController: anotherViewController] -
// [liberação anotherViewController] -
}
O método em si não é comentada, mas todas as instruções dentro dela são. Estas linhas comentadas fornecer uma pista sobre o que deve acontecer. A linha
[Self.navigationController pushViewController: anotherViewController] -
é a chave tanto para o funcionamento deste método e a causa do erro. Ele empurra um novo controlador de vista sobre a pilha de navegação e exibe-lo, exatamente o que você quer que ele faça. No entanto, se você descomente esta linha e ajustá-lo para usar o novo controlador de exibição que você criou, você vai receber um aviso quando você construí-lo: "aviso: `UINavigationController` pode não responder a -pushViewController:" Mas, bem , este é um aviso, não um erro. Pshaw. Executá-lo, embora, e você obterá o erro acima, e selector não reconhecido enviada para uma instância.
Video: More UINavigationController
Se o que você leu até agora soa familiar, a solução provável é simples. A linha acima a partir do modelo da Apple fornecido está errado. Há realmente não é uma assinatura da mensagem para UINaigationController chamado -pushViewController: mas há um chamado -pushViewController: animado: - Oops! Desculpe a Apple! Nós ainda amamos você, no entanto. Muito fácil de corrigir, mas se isso acontecer depois de um longo dia de codificação, pode causar frustração indevida. A linha corrigida deve ser algo como:
[Self.navigationController pushViewController: anotherViewController animado: YES] -
Video: Lesson 3 - UINavigationController
Reconstruir e este erro será resolvido! Se este era o seu problema. Se não fosse, então não se desespere. Descriptografar mensagens de exceção é parte da diversão parte do estilo de vida de coderdom. Um “selector não reconhecido” ainda vai consultar a mensagem que você está enviando “para exemplo,” algum objeto que você criou. A exceção, mesmo nos diz qual classe do objeto que está recebendo a mensagem estranha (UINavigationController neste caso) ea mensagem que foi enviada (pushViewController :). Neste caso, o compilador sabia que havia alguma coisa nojenta sobre a mensagem a ser enviada, mas pode não ser sempre capaz de determinar isso, então você não pode contar com ele. No entanto, você deve ser capaz de procurar o seu código para a mensagem reportada na exceção do registro de console. Certifique-se de que tudo está correto nesta linha verificação na documentação para a natureza exata da chamada.